﻿using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Moq;
using Triunfadores.BusinessEntities;
using Triunfadores.BusinessLogic;
using Triunfadores.BusinessLogic.Service;
using Triunfadores.Repository;
using Triunfadores.Repository.Service;

namespace Triunfadores.Test
{
    [TestClass]
    public class AccionTest
    {
        public readonly IAccionService MockAccionService;

        public AccionTest()
        {
            var AccionesList = new List<Accion>()
            {
                new Accion() {Id = 1, Descripcion = "Principal", Precio = 10},
                new Accion() {Id = 2, Descripcion = "Segundo", Precio = 20},
                new Accion() {Id = 3, Descripcion = "Tercero", Precio = 30},
                new Accion() {Id = 4, Descripcion = "Cuarto", Precio = 40},
                new Accion() {Id = 5, Descripcion = "Quinto", Precio = 50},
                new Accion() {Id = 6, Descripcion = "Sexto", Precio = 60},
                new Accion() {Id = 7, Descripcion = "Septimo", Precio = 70}
            };

            Mock<IAccionService> mockAccionRepository = new Mock<IAccionService>();
            mockAccionRepository.Setup(a => a.ObtenerTodasLasAcciones()).Returns(AccionesList);

            //devolver por id
            mockAccionRepository.Setup(a => a.ObtenerAccionPorId(It.IsAny<Int32>()))
                .Returns((int id) => AccionesList.Where(a => a.Id == id).SingleOrDefault());

            //AddAccion
            mockAccionRepository.Setup(a => a.AddAccion(It.IsAny<Accion>()))
                .Callback((Accion accion) =>
                {
                    AccionesList.Add(accion);
                });

            MockAccionService = mockAccionRepository.Object;

        }

        [TestMethod]
        public void GetAllAcciones()
        {
            var testAcciones = this.MockAccionService.ObtenerTodasLasAcciones();
            Assert.IsNotNull(testAcciones);
            Assert.AreEqual(7, testAcciones.Count());
        }

        [TestMethod]
        public void ObtenerAccionPorIdTest()
        {
            AccionRepository target = new AccionRepository();
            int id = 1;
            Accion actual;
            actual = target.ObtenerAccionPorId(id);
            Assert.IsTrue(actual.Id == 1);
        }

        [TestMethod]
        public void AddAcciones()
        {
            var NewAcciones = new Accion()
            {
                Id = 8,
                Descripcion = "Octaba",
                Precio = 80
            };

            this.MockAccionService.AddAccion(NewAcciones);

            var testAccion = this.MockAccionService.ObtenerTodasLasAcciones();

            Assert.IsNotNull(testAccion);
            Assert.AreEqual(8,testAccion.Count());
        }

        [TestMethod]
        public void UpdateAccionTest()
        {
            AccionRepository target = new AccionRepository();
            var ID = 1;
            var DESCRIPCION = "ACCION ACTUALIZADA";
            Accion accion = new Accion()
            {
                Id= ID,
                Descripcion = DESCRIPCION
                
            };
            target.UpdateAccion(accion);
            var existe = target.ObtenerAccionPorId(ID);
            Assert.IsTrue(existe.Descripcion == DESCRIPCION);
        }
    }
}
